package JUC并发编程.三大特性.原子性.CAS保证原子性;

import org.junit.Test;

import java.util.concurrent.atomic.AtomicInteger;


/**
 *  todo CAS的缺点 : 自旋时间过长问题
 *
 *    自旋 ：AtomicInteger类下，incrementAndGet() 方法中，unsafe.getAndAddInt()方法下
 *          do{
 *              ...
 *          }while(！this.compareAndSwap(v1, v2, v5, v5+v4))
 *          todo 一直在 compareAndSwap(比较和交换)，此时会进行cup调度，如果不满足条件判断，就会产生自旋
 *
 *  todo 解决方式：自旋锁
 *      可以指定CAS一共循环多少次，如果超过这个次数，直接失败即可(跟synchronized轻量级锁一样的处理方式)
 *
 *      自旋锁 ：cas自带的一种逻辑方式，指定循环多少次，超出次数失败
 *
 *      自适应锁 ：不指定循环多少次，自己进行判断
 *
 *      可以在CAS一次失败后，将这个操作暂存起来，后面要获取结果时，将缓存的操作全部执行。
 *
 *
 */
public class CASTest {

    private static  AtomicInteger count = new AtomicInteger(0);

    @Test
    public void test01() throws InterruptedException {
        Thread thread = new Thread(() -> {
           for(int i = 0; i < 100; i++){
               count.incrementAndGet();
           }
        });


        Thread thread2 = new Thread(() -> {
            for(int i = 0; i< 100; i++){
                count.incrementAndGet();
            }
        });

        thread.start();
        thread2.start();
        thread.join();
        thread2.join();
        System.out.println(count);
    }
}
